package de.schule.barnimgymnasium.autotransporter;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.swt.graphics.Point;

import de.schule.barnimgymnasium.autotransporter.spiele.SpielEventListener;

public class Stellplatz {
	private Point basis = null;
	private Point position; // relative Position des Stellplatzes zur Basis
	private SnapPoint snap;
	Auto auto;
	List<SpielEventListener> listeners = new ArrayList<SpielEventListener>();

	public Stellplatz(final Point basis, final Point position) {
		if (position == null) {
			throw new NullPointerException();
		}
		this.basis = basis;
		this.position = position;
		snap = new SnapPoint(new Point(basis.x + position.x, basis.y
				+ position.y), 30);
	}

	public void updateSnap() {
		snap.getLocation().x = basis.x + position.x;
		snap.getLocation().y = basis.y + position.y;
	}

	public SnapPoint getSnap() {
		return snap;
	}

	public Auto getAuto() {
		return this.auto;
	}

	public Point getPosition() {

		return new Point(basis.x + position.x, basis.y + position.y);
	}

	public boolean registerSpielEventListener(final SpielEventListener listener) {
		return this.listeners.add(listener);
	}

	public boolean removeSpielEventListener(final SpielEventListener listener) {
		return this.listeners.remove(listener);
	}

	public void platziereAuto(final Auto auto) throws NotEmptyException {
		// Hier sollte man prüfen, ob man ein Auto zum Platzieren übergeben
		// bekommen hat
		if (auto == null) {
			throw new IllegalArgumentException(
					"Kein Auto zum Platzieren vorhanden");
		}
		boolean hierPlaziert = (auto.getLocation().x == getPosition().x && auto
				.getLocation().y == getPosition().y);
		// Ist der Stellplatz leer?
		if (this.auto != null) {
			if (this.auto == auto && !hierPlaziert)
				this.auto = null;
			statusChanged();
		} else if (hierPlaziert) {
			this.auto = auto;
			auto.setLocation(snap.getLocation());
			statusChanged();
		}
	}

	private void statusChanged() {
		// System.out.println("status changed: x:" + position.x + ", y:"
		// + position.y);
		for (SpielEventListener l : listeners) {
			l.stellplatzGeaendert(this);
		}
	}
}
